// 查询实例化（Query Instantiation）是什么？
// 查询实例化是一种理论上的模板实例化策略，其核心思想是：
// 1.编译器在所有翻译单元之间维护一个模板实例化的“数据库”。
// 2.当某个翻译单元需要某个模板实例时，编译器会查询这个数据库，判断该实例是否已经被生成。
// 3.如果没有，则生成实例化代码并登记到数据库；如果已经有了，就直接引用，避免重复生成。
// 这种方式的目标是最大限度地减少模板实例化代码的冗余，保证所有用到的模板实例只生成一份。

// ----------------------------------------------------------------
// 查询实例化的优缺点
// 优点：
// 1)只生成一份模板实例化代码，避免冗余和目标文件膨胀。
// 2)理论上可以保证所有用到的模板实例都一致。
// 缺点：
// 1)需要在编译阶段维护跨翻译单元的数据库，增加了编译器的实现复杂度。
// 2)目前主流编译器都没有采用这种方式，因为实现难度较大，且与现有的编译/链接模型不兼容。

// ----------------------------------------------------------------
// 例子说明
// myfunc.h
template <typename T>
void myfunc(T val)
{
    std::cout << "Value: " << val << std::endl;
}

// a.cpp
#include "myfunc.h"
void foo() { myfunc(42); }

// b.cpp
#include "myfunc.h"
void bar() { myfunc(100); }

// 如果采用查询实例化：
// 1.编译 a.cpp 时，编译器发现需要 myfunc<int>，查询数据库，没有，于是生成并登记。
// 2.编译 b.cpp 时，发现 myfunc<int> 已经登记过了，就直接引用，不再生成新的实例化代码。
// 3.最终链接时，只有一份 myfunc<int> 的代码被使用。

// -----------------------------------------------------------------
// 实际现状
// 查询实例化目前主要是理论上的方案，主流编译器（如GCC、Clang、MSVC）并没有采用。
// 书中也提到：“这种方式没有被市场接受，我也没有想明白这个要怎么做。”（原文）
